package com.flick.searchShop.service;
import java.util.regex.Pattern;


import com.flick.common.SpringContext;
import com.flick.po.ShopType;
import com.flick.searchShop.dao.ShopTypeDao;
import edu.uci.ics.crawler4j.crawler.Page;
import edu.uci.ics.crawler4j.crawler.WebCrawler;
import edu.uci.ics.crawler4j.parser.HtmlParseData;
import edu.uci.ics.crawler4j.url.WebURL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyCrawler extends WebCrawler {

    /**
     * 正则匹配指定的后缀文件
     */
    private final static Pattern FILTERS = Pattern.compile(".*(\\.(css|js|gif|jpg"
            + "|png|mp3|mp3|zip|gz))$");

    /**
     * 这个方法主要是决定哪些url我们需要抓取，返回true表示是我们需要的，返回false表示不是我们需要的Url
     * 第一个参数referringPage封装了当前爬取的页面信息
     * 第二个参数url封装了当前爬取的页面url信息
     */
    @Override
    public boolean shouldVisit(Page referringPage, WebURL url) {
        String href = url.getURL().toLowerCase();  // 得到小写的url
        if(FILTERS.matcher(href).matches())    // 正则匹配，过滤掉我们不需要的后缀文件
            return false;
        if(href.startsWith("http://search.ccoop.com.cn/mall/CommodityList/toCommodityListMgr.ihtml".toLowerCase()))  // url必须是http://www.java1234.com/开头，规定站点
            return true;
        else
            return false;
    }

    /**
     * 当我们爬到我们需要的页面，这个方法会被调用，我们可以尽情的处理这个页面
     * page参数封装了所有页面信息
     */
    @Override
    public void visit(Page page) {
        String url = page.getWebURL().getURL();  // 获取url
        System.out.println("URL: " + url);

        if (page.getParseData() instanceof HtmlParseData) {  // 判断是否是html数据
            HtmlParseData htmlParseData = (HtmlParseData) page.getParseData(); // 强制类型转换，获取html数据对象
//            String text = htmlParseData.getText();  // 获取页面纯文本（无html标签）
            String html = htmlParseData.getHtml();  // 获取页面Html

//            Set<WebURL> links = htmlParseData.getOutgoingUrls();  // 获取页面输出链接
//            System.out.println("title:"+htmlParseData.getTitle());
//            System.out.println("纯文本长度: " + text.length());
//            System.out.println("html长度: " + html.length());
//            System.out.println("输出链接个数: " + links.size());
//            System.out.println("HTML:"+htmlParseData.getHtml());
            ShopType shopType = new ShopType();
            String oprtCatNo = url.substring(url.lastIndexOf("=")+1);
//            System.out.println("oprtCatNo:"+oprtCatNo);
            shopType.setOprtCatNo(oprtCatNo);
            Document doc = Jsoup.parse(html);
            String brand = doc.select("span.current").first().text();
            shopType.setTypeName(brand);
//            System.out.println("span:"+brand);
            Elements e = doc.getElementsByTag("script");
            /*循环遍历script下面的JS变量*/
            int total = 0;
            int pageSize = 0;
            for (Element element : e) {
                /*取得JS变量数组*/
                String[] data = element.data().toString().split("var");
                /*取得单个JS变量*/

                for (String variable : data) {
                    /*过滤variable为空的数据*/
                    if (variable.contains("=")) {
                        /*取到满足条件的JS变量*/
                        if (variable.contains("totalRows") || variable.contains("pageSize")) {
                            String[] kvp = variable.split("=");
                            String vaule = kvp[1].substring(0,kvp[1].indexOf(";"));

                            if(kvp[0].indexOf("totalRows") >= 0) {
                                total = Integer.parseInt(vaule.substring(vaule.indexOf("'") + 1, vaule.lastIndexOf("'")));
                                shopType.setTotal(total);
                            }
                            else {
                                pageSize = Integer.parseInt(vaule.trim());
                                shopType.setPageSize(pageSize);
                            }
                        }
                    }
                }
            }
//            System.out.println("total:"+total+",pageSize:"+pageSize);
            ShopTypeDao dao = (ShopTypeDao) SpringContext.getContext().getBean("MongoDbUtilImpl");
            System.out.println(oprtCatNo+":插入成功！");
            dao.insert(shopType);
        }
    }
}